/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.socialfun.controladores;

import com.ec.socialfun.datamanager.CreacionUsuarioSucursalDataManager;
import com.ec.socialfun.entidades.Sucursal;
import com.ec.socialfun.entidades.Usuario;
import com.ec.socialfun.enumeradores.EstadoEnum;
import com.ec.socialfun.excepciones.ActualizarDatosUsuarioException;
import com.ec.socialfun.excepciones.CreacionUsuarioSucursalException;
import com.ec.socialfun.servicios.SucursalFacade;
import com.ec.socialfun.servicios.UsuarioFacade;
import com.ec.socialfun.validadores.MailValidador;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UISelectOne;
import javax.faces.component.UIViewRoot;
import javax.faces.component.html.HtmlInputText;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.jboss.logging.Logger;
import org.primefaces.event.CloseEvent;

/**
 *
 * @author jorge
 */
@ManagedBean
@RequestScoped
public class CreacionUsuarioSucursalControlador extends PadreControlador {

    private static final Logger LOG = Logger.getLogger(CreacionUsuarioSucursalControlador.class.getName());
    @ManagedProperty(value = "#{creacionUsuarioSucursalDataManager}")
    private CreacionUsuarioSucursalDataManager creacionUsuarioSucursalDataManager;
    @EJB
    private SucursalFacade sucursalFacade;
    @EJB
    private UsuarioFacade usuarioFacade;
    @ManagedProperty(value = "#{mailValidador}")
    private MailValidador mailValidador;

    /**
     * Creates a new instance of CreacionUsuarioSucursalControlador
     */
    public CreacionUsuarioSucursalControlador() {
    }

    @Override
    public void iniciarDatos() {
        LOG.info("iniciar datos ");
        List<Sucursal> listaSucursales = sucursalFacade.recuperaPorUsuario(this.obtenerUsuarioLogeado());
        getCreacionUsuarioSucursalDataManager().setListaSucursales(listaSucursales);
    }

    /**
     * recupera la lista de las sucursales del local
     * @return
     */
    public List<SelectItem> getSelectItemSucursales() {
        List<SelectItem> lista = getSelectItemPorDefecto();
        List<Sucursal> listaSucursal = getCreacionUsuarioSucursalDataManager().getListaSucursales();
        for (Sucursal sucursalTmp : listaSucursal) {
            lista.add(new SelectItem(sucursalTmp, sucursalTmp.getSuNombre()));
        }
        return lista;
    }

    /**
     * recuepra lista de estado ACTIVO e INACTIVO
     * @return
     */
    public List<SelectItem> getSelectItemEstadoActivoInactivo() {
        List<SelectItem> lista = getSelectItemPorDefecto();
        lista.add(new SelectItem(EstadoEnum.ACTIVO.getCodigo(), EstadoEnum.ACTIVO.getNombre()));
        lista.add(new SelectItem(EstadoEnum.INACTIVO.getCodigo(), EstadoEnum.INACTIVO.getNombre()));
        return lista;
    }

    /**
     * selecciona la suscursal de la lista, carga los usuarios asignados a esta sucursal
     */
    public void seleccionaSucursal() {
        Sucursal sucursal = getCreacionUsuarioSucursalDataManager().getSucursal();
        if (sucursal == null || sucursal.getSuCodigo() == null) {
            getCreacionUsuarioSucursalDataManager().setUsuariosCreados(new ArrayList<Usuario>());
            this.mensajeError("Seleccione una sucursal");
        } else {
            getCreacionUsuarioSucursalDataManager().setSucursal(sucursalFacade.recuperarPorCodigo(sucursal.getSuCodigo()));
            List<Usuario> usuarios = usuarioFacade.recuperaUsuariosCreadosParaSucursal(getCreacionUsuarioSucursalDataManager().getSucursal());
            getCreacionUsuarioSucursalDataManager().setUsuariosCreados(usuarios);
            getCreacionUsuarioSucursalDataManager().setUsuarioSucursal(new Usuario());
            getCreacionUsuarioSucursalDataManager().setUsuarioSeleccionado(new Usuario());
        }
    }

    /**
     * crea un nuevo usuario relacionado a una sucursal
     */
    public void crearUsuarioSucursal() {

        try {
            if (getCreacionUsuarioSucursalDataManager().getSucursal() == null || getCreacionUsuarioSucursalDataManager().getSucursal().getSuCodigo() == null) {
                getCreacionUsuarioSucursalDataManager().setUsuariosCreados(new ArrayList<Usuario>());
                this.mensajeError("Seleccione una sucursal");
            } else {
                Usuario usuario = getCreacionUsuarioSucursalDataManager().getUsuarioSucursal();
                usuarioFacade.creacionUsuarioSucursal(usuario, getCreacionUsuarioSucursalDataManager().getSucursal());
                List<Usuario> usuarios = usuarioFacade.recuperaUsuariosCreadosParaSucursal(getCreacionUsuarioSucursalDataManager().getSucursal());
                getCreacionUsuarioSucursalDataManager().setUsuariosCreados(usuarios);
                getCreacionUsuarioSucursalDataManager().setUsuarioSucursal(new Usuario());
                getCreacionUsuarioSucursalDataManager().setUsuarioSeleccionado(new Usuario());
                this.mensajeExitoso("Usuario creado ");
            }
        } catch (CreacionUsuarioSucursalException ex) {
            LOG.error("Error al crear usuario sucursal " + ex);
            this.mensajeError("No se ha podido crear usuario ");
        }
    }

    /**
     * actualiza los datos del usuario perteneciente a la sucursal
     */
    public void actualizarUsuarioSucursal() {
        try {
            if (getCreacionUsuarioSucursalDataManager().getSucursal() == null || getCreacionUsuarioSucursalDataManager().getSucursal().getSuCodigo() == null) {
                this.mensajeError("Debe seleccionar una sucursal");
            } else {
                Usuario usuario = getCreacionUsuarioSucursalDataManager().getUsuarioSeleccionado();
                usuarioFacade.actualizarUsuarioConEncriptacionDeContraena(usuario);
                List<Usuario> usuarios = usuarioFacade.recuperaUsuariosCreadosParaSucursal(getCreacionUsuarioSucursalDataManager().getSucursal());
                getCreacionUsuarioSucursalDataManager().setUsuariosCreados(usuarios);
                getCreacionUsuarioSucursalDataManager().setUsuarioSucursal(new Usuario());
                this.mensajeExitoso("Datos actualziados correctamente");
            }

        } catch (ActualizarDatosUsuarioException e) {
            LOG.error("Error al actualizar datos del usuario " + e);
            this.mensajeError("Error al actualizar datos del usuario ");
        }
    }

    
    /**
     * metodo que elimina los datos del formulario del dialogo al momento de cerrarlo
     * @param event
     */
    public void cerrarDialogo(CloseEvent event) {

        try {
            LOG.info("Cerrar dialogo");
            List<Usuario> usuarios = usuarioFacade.recuperaUsuariosCreadosParaSucursal(getCreacionUsuarioSucursalDataManager().getSucursal());
            getCreacionUsuarioSucursalDataManager().setUsuariosCreados(usuarios);
            getCreacionUsuarioSucursalDataManager().setUsuarioSeleccionado(new Usuario());
            FacesContext facesContext = FacesContext.getCurrentInstance();
            UIViewRoot uiViewRoot = facesContext.getViewRoot();
            HtmlInputText inputText = (HtmlInputText) uiViewRoot.findComponent("formDialogoEditarUsuario:editarUsuarioNombreID");
            inputText.setValue(null);
            inputText.setSubmittedValue(null);
            inputText.setLocalValueSet(false);
            inputText = (HtmlInputText) uiViewRoot.findComponent("formDialogoEditarUsuario:editarUsuarioApellidoID");
            inputText.setValue(null);
            inputText.setSubmittedValue(null);
            inputText.setLocalValueSet(false);
            UISelectOne inputSelectOne = (UISelectOne) uiViewRoot.findComponent("formDialogoEditarUsuario:editarUsuarioEstadoID");
            inputSelectOne.setValue(null);
            inputSelectOne.setSubmittedValue(null);
            inputSelectOne.setLocalValueSet(false);
        } catch (Exception e) {
           LOG.error(" Error al cerrar dialogo " + e);
           this.mensajeError(" Error al cerrar dialogo");
        }


    }

    public CreacionUsuarioSucursalDataManager getCreacionUsuarioSucursalDataManager() {
        return creacionUsuarioSucursalDataManager;
    }

    public void setCreacionUsuarioSucursalDataManager(CreacionUsuarioSucursalDataManager creacionUsuarioSucursalDataManager) {
        this.creacionUsuarioSucursalDataManager = creacionUsuarioSucursalDataManager;
    }

    public MailValidador getMailValidador() {
        return mailValidador;
    }

    public void setMailValidador(MailValidador mailValidador) {
        this.mailValidador = mailValidador;
    }
}
